Programming languages such as Java™ provide various correctness checking mechanisms such as null pointer dereferencing detection, which alleviates the programmer from having to manually detect and debug these low level programmer errors. However, in recent years, the size and complexity of applications written in these languages has steadily grown, and detecting and debugging errors in these programs has once again become increasingly difficult. There are several basic reasons for this. First, as the language proliferates, various third party frameworks and libraries have been developed. As a result, it has become increasingly easier even for non-expert programmers to build massively complex production quality applications, spanning literally millions of lines of code. Second, many of these applications make heavy use of concurrency and heap. Unrestricted use of heap pointers is particularly difficult to understand and debug. Incidental and accidental pointer aliasing results in unexpected side effects of seemingly unrelated operations, and are a major source of system failures. This problem is only exacerbated in the presence of concurrent operations modifying the heap. Third, while the applications have grown in complexity, the basic correctness checks provided by the programming language have generally remained the same, even though the hardware resources available to the language runtime have also increased (e.g. multiple processors and/or cores).